# -*- coding: utf-8 -*-
from selenium import webdriver                          # 缺点：
from lxml import etree                                      # 1.不稳定，容易被远程主机强迫关闭
import requests                                             # 2.txt暂时不能爬取，应当抛出异常，避免程序终止
import os


# 获取该一级页面所有文章的连接
def analysis(html):                                 # 传入网页源码
    us = etree.HTML(html).xpath('//*[@id="office-tab-box"]/div/div[1]/div[3]/ul/li/h4/a')
    urls = []
    for u in us:
        url = 'http://ishare.iask.sina.com.cn' + u.xpath('@href')[0]
        urls.append(url)
        print(url)
    return urls                                     # 返回url列表


# 解析页面(二级) ---下载
def analysis_pages(path, html):                     # 传入参数：总路径，网页源码
    title = etree.HTML(html).xpath('//*[@id="swfPreview"]/div/div[1]/h2/@title')[0]     # 文档标题
    fpath = path + '\\' + title
    os.mkdir(fpath)     # 创建目录
    imgs = etree.HTML(html).xpath('//*[@id="canvasWrapper"]/div/div/img')               # 所有的 imgs 对象
    count = 0
    for img in imgs:
        count += 1

        img_url = img.xpath('@data-src')            # 有的图片的 地址位于 src 中,有的图片地址位于 data-src 中
        if img_url == []:                           # 所以，判断当 data-src 中没有内容的时候,换用另一种方法
            img_url = img.xpath('@src')
        imgs = requests.get(img_url[0])             # 对图片网址发出请求，下载

        save_imgs(fpath, count, imgs)               # 存储（写入）


# 保存文件内容
def save_imgs(path, count, imgs):                   # 传参：完全路径目录，图片计数，imgs内容
    file_name = path + '\\' + str(count) + '.jpg'
    # 保存文件
    try:
        f = open(file_name, 'ab+')                  # 打开
        f.write(imgs.content)                       # 写入内容
        f.close()                                   # 关闭
    except:
        print("error")


# 模拟浏览器（渲染）
def render(text, path):                             # 传参：搜索内容，总目录
    driver = webdriver.PhantomJS()
    driver.get('http://ishare.iask.sina.com.cn/')
    driver.find_element_by_id("scondition").send_keys(text)
    driver.find_element_by_id("searchBtn").click()
    html = driver.page_source
    urls = analysis(html)                           # 调用analysis(html)，获取连接列表
    num = len(urls)

    now_handle = driver.current_window_handle       # 获取当前窗口句柄

    for n in range(1, num + 1):                     # 对当前一级网页中所有文章链接，依次点击，在新窗口打开
        driver.find_element_by_xpath(
            '//*[@id="office-tab-box"]/div/div[1]/div[3]/ul/li[' + str(n) + ']/h4/a/span').click()

    handles = (driver.window_handles)               # 获取当前窗口句柄集合（列表类型）
    print(handles)
    for handle in handles:                          # 切换窗口，聚焦新窗口
        if handle != now_handle:
            print('switch to ', handle)
            driver.switch_to_window(handle)
            try:
                for i in range(15):                 # 顶多点击15次，继续阅读按钮一定被点完
                    driver.find_element_by_xpath(
                        '//*[@id="swfPreview"]/div/div[5]/div[2]/div/div[3]/a/p/span[2] | //*[@id="swfPreview"]/div/div[5]/div[2]/div/div[4]/a/p/span[2] | //*[@id="swfPreview"]/div/div[5]/div[2]/div/a/p/span[2]').click()
            except:
                pass
            finally:
                html = driver.page_source
                driver.close()
                analysis_pages(path, html)          # 调用函数analysis_pages()解析二级页面,下载

    driver.switch_to_window(handles[0])             # 切换回原窗口
    driver.quit()                                   # 退出驱动关闭所有窗口


if __name__ == "__main__":
    text = input("请输入要搜索的内容：")
    path = 'H:\\新建文件夹\\百度文库下载'
    render(text, path)
